package com.example.lt.controller;

import com.example.lt.constant.MessageConstant;
import com.example.lt.context.BaseContext;
import com.example.lt.pojo.dto.*;
import com.example.lt.pojo.entity.Consumer;
import com.example.lt.pojo.vo.UserDetailVO;
import com.example.lt.pojo.vo.UserLoginVO;
import com.example.lt.pojo.vo.UserVO;
import com.example.lt.result.Result;
import com.example.lt.service.ConsumerService;
import com.example.lt.utils.EmailUtil;
import com.example.lt.utils.RandomUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

/**
 * @Author 小涛Tao
 * @Date: 2024/05/29/16:51
 * version 1.0 注释：
 **/
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/consumer")
public class ConsumerController {

    private final ConsumerService consumerService;

    private final EmailUtil emailUtil;

    /**
     * 管理端获取所有用户信息
     * @return
     */
    @GetMapping("/admin/getAllUser")
    public Result<List<UserDetailVO>> getAllUser() {
        log.info("管理端获取所有用户信息");
        return consumerService.getAllUser();
    }

    /**
     * 管理端更新用户头像
     * @param avatorFile
     * @param id
     * @return
     */
    @PostMapping("/admin/avatar")
    public Result adminUpdateUserAvator(@RequestParam("file") MultipartFile avatorFile, @RequestParam("id") int id) {
        log.info("管理端更新用户头像：{}",id);
        return consumerService.updateUserAvator(avatorFile, id);
    }

    /**
     * 管理端删除用户，永久删除的
     * @param id 用户id
     * @return
     */
    @GetMapping("/admin/delete")
    public Result deleteUser(@RequestParam Integer id) {
        log.info("删除用户：{}",id);
        return consumerService.deleteUser(id);
    }

    /**
     * 用户账号登录
     * @param userLoginDTO
     * @return
     */
    @PostMapping("/user/login")
    public Result<List<UserLoginVO>> userLogin(@RequestBody UserLoginDTO userLoginDTO) {
        log.info("用户账号登录：{}",userLoginDTO);
        return consumerService.userLogin(userLoginDTO); // 调用service层登录方法
    }

    /**
     * 用户邮箱登录
     * @param userLoginDTO
     * @return
     */
    @PostMapping("/user/emailLogin")
    public Result<List<UserLoginVO>> emailLogin(@RequestBody UserLoginDTO userLoginDTO) {
        log.info("用户邮箱登录：{}",userLoginDTO);
        return consumerService.emailLogin(userLoginDTO);
    }

    /**
     * 注册账号接口
     * @param userRegisterDTO
     * @return
     */
    @PostMapping("/user/register")
    public Result register(@RequestBody UserRegisterDTO userRegisterDTO) {
        log.info("注册新账号：{}",userRegisterDTO);
        return consumerService.register(userRegisterDTO);
    }

    /**
     * 用户修改密码接口
     * @param updatePwdDTO 内含用户id、用户名、旧密码和新密码
     * @return
     */
    @PostMapping("/user/updatePassword")
    public Result updatePassword(@RequestBody UpdatePwdDTO updatePwdDTO) {
        log.info("用户修改密码：{}",updatePwdDTO);
        return consumerService.updatePassword(updatePwdDTO);
    }

    /**
     * 用户重置密码
     * @param userResetPwdDTO
     * @return
     */
    @PostMapping("/user/resetPassword")
    public Result resetPassword(@RequestBody UserResetPwdDTO userResetPwdDTO) {
        log.info("用户重置密码：{}",userResetPwdDTO);
        return consumerService.resetPassword(userResetPwdDTO);
    }

    /**
     * 根据用户id来获取用户信息
     * @param id
     * @return
     */
    @GetMapping("/user/byId")
    public Result<List<UserVO>> getUserById(@RequestParam Integer id) {
        log.info("获取用户信息：{}",id);
        List<UserVO> userVOs = consumerService.getUserById(id);
        return Result.success(userVOs);
    }

    /**
     * 根据用户id获取用户详细信息
     * @param id
     * @return
     */
    @GetMapping("/user/detail")
    public Result<List<UserDetailVO>> geUserDetail(@RequestParam Integer id) {
        log.info("获取用户详细详细：{}",id);
        List<UserDetailVO> userDetailVOS = consumerService.geUserDetail(id);
        return Result.success(userDetailVOS);
    }

    /**
     * 更新用户头像
     * @param avatorFile
     * @param id
     * @return
     */
    @PostMapping("/user/avatar")
    public Result updateUserAvator(@RequestParam("file") MultipartFile avatorFile, @RequestParam("id") int id) {
        id = BaseContext.getCurrentId();
        log.info("更新用户头像：{}",id);
        return consumerService.updateUserAvator(avatorFile, id);
    }

    /**
     * 修改用户信息
     * @param userUpdateDTO
     * @return
     */
    @PostMapping("/user/update")
    public Result updateUserMsg(@RequestBody UserUpdateDTO userUpdateDTO) {
        userUpdateDTO.setId(BaseContext.getCurrentId());
        log.info("修改用户信息：{}",userUpdateDTO);
        return consumerService.updateUserMsg(userUpdateDTO);
    }

    /**
     * 注销用户
     * @param id
     * @return
     */
    @GetMapping("/user/delete")
    public Result logOutUser(@RequestParam Integer id) {
        id = BaseContext.getCurrentId();
        log.info("注销用户：{}",id);
        return consumerService.logOutUser(id);
    }

    /**
     * 发送邮箱验证码，用于注册
     * @param userLoginDTO
     * @return
     */
    @PostMapping("/common/verify")
    public Result sendCode(@RequestBody UserLoginDTO userLoginDTO) {
        String email = userLoginDTO.getEmail();
        log.info("发送邮箱验证码：{}",email);
        if (consumerService.checkEmail(email)) { // 如果此邮箱已经被注册了
            return Result.error(MessageConstant.EMAIL_EXIST);
        }
        String code = RandomUtils.code();
        //long start = System.currentTimeMillis(); // 记录发送邮箱的开始时间
        emailUtil.sendRegisterCode(email, code); // 调用发送邮箱工具发送邮箱 (这里的发送邮件方法是异步的)
        //System.out.println(System.currentTimeMillis() - start); // 打印发送邮箱所花费的时间
        consumerService.redisSaveCode(email, code); // 把验证码放入redis中

        return Result.success(MessageConstant.CODE_SEND_SUCCESS);
    }

    /**
     * 发送邮箱验证码，用于重置密码
     * @param userLoginDTO
     * @return
     */
    @PostMapping("/common/sendCode")
    public Result sendEmailCode(@RequestBody UserLoginDTO userLoginDTO) {
        String email = userLoginDTO.getEmail();
        log.info("发送用于重置密码的邮箱验证码：{}",email);
        if (!consumerService.checkEmail(email)) {
            return Result.error(MessageConstant.EMAIL_NOT_FOUND);
        }
        String code = RandomUtils.code();
        emailUtil.sendCode(email, code); // 调用发送邮箱工具发送邮箱 (这里的发送邮件方法是异步的)
        consumerService.redisSaveCode(email, code); // 把验证码放入redis中

        return Result.success(MessageConstant.CODE_SEND_SUCCESS);
    }

    /**
     * 用户充值会员
     * @param duration
     * @return
     */
    @PostMapping("/user/recharge")
    public Result recharge(@RequestParam Integer duration) {
        log.info("用户充值会员时间为：{}",duration);
        System.out.println(duration);
        String orderNo = null;
        if (duration == 1) {
            orderNo = consumerService.recharge("1", 10.0);
        } else if (duration == 3) {
            orderNo = consumerService.recharge("3", 25.0);
        } else {
            orderNo = consumerService.recharge("12", 80.0);
        }
        if (orderNo == null) {
            return Result.error("订单生成失败");
        }
        return Result.success("订单生成成功", orderNo);
    }

}
